package cn.itcast.web.controller.cargo;


import cn.itcast.domain.cargo.Contract;
import cn.itcast.domain.cargo.ContractExample;
import cn.itcast.domain.system.User;
import cn.itcast.service.cargo.ContractService;
import cn.itcast.service.system.UserService;
import cn.itcast.vo.ContractEmail;
import cn.itcast.web.controller.BaseController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.github.pagehelper.PageInfo;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
@RequestMapping("/cargo/contract")
public class ContractController extends BaseController {
    @Reference
    private ContractService contractService;

    @Autowired
    private UserService userService;

    @Autowired
    private RabbitTemplate rabbitTemplate;

    /*分页查找购销合同列表*/
    @RequestMapping("/list")
    public String findAll(@RequestParam(defaultValue = "1") Integer pageNum,@RequestParam(defaultValue = "5") Integer pageSize){
        ContractExample contractExample = new ContractExample();
        contractExample.setOrderByClause("create_time desc");//desc 降序、 asc 升序

        Integer degree = getLoginUser().getDegree();
        if (degree==4){
            //普通员工，只能查看自己签的购销合同
            contractExample.createCriteria().andCreateByEqualTo(getLoginUser().getId());
        }else if (degree==3){
            //部门经理，可以查看本部门的所有购销合同
            contractExample.createCriteria().andCreateDeptEqualTo(getLoginUser().getDeptId());
        }else if (degree==2){
            //大区经理，可以查看本部门以及下属部门的购销合同
            PageInfo<Contract> pageInfo = contractService.findPageByDeptId(getLoginUser().getCompanyId(),getLoginUser().getDeptId(), pageNum, pageSize);
            request.setAttribute("pageInfo",pageInfo);
            return "cargo/contract/contract-list";
        }else if (degree==1){
            //系统管理员，可以查看该公司的所有购销合同
            contractExample.createCriteria().andCompanyIdEqualTo(getLoginUser().getCompanyId());
        }

        PageInfo<Contract> pageInfo = contractService.findByPage(contractExample, pageNum, pageSize);
        request.setAttribute("pageInfo",pageInfo);
        return "cargo/contract/contract-list";
    }

    /*
      url:/contract/toAdd.do
      作用： 进入添加页面
      参数： 无
     */
    /*需求4*/
    @RequestMapping("/toAdd")
    public String toAdd(){
        //1、查找审单人列表（暂定是所有用户）
        List<User> userList = userService.findAll(getLoginUserCompanyId());
        List<String> userNameList = new ArrayList<>();
        for (User user : userList) {
            userNameList.add(user.getUserName());
        }
        request.setAttribute("userNameList",userNameList);
        return "cargo/contract/contract-add";
    }

    /*
          url:/contract/edit.do
          作用： 保存、修改 购销合同信息
          参数： contract
         */
    @RequestMapping("/edit")
    public String edit(Contract contract){
        //购销合同的创建人
        contract.setCreateBy(getLoginUser().getId());
        //购销合同的创建人所属的部门
        contract.setCreateDept(getLoginUser().getDeptId());
        //购销合同的创建人所属的企业id
        contract.setCompanyId(getLoginUserCompanyId());
        //购销合同的创建人所属的企业名称
        contract.setCompanyName(getLoginUserCompanyName());

        if (StringUtils.isEmpty(contract.getId())){
            //如果id为空，添加购销合同信息
            contractService.save(contract);
        }else {
            //页面有传id，修改购销合同信息
            contractService.update(contract);
        }
        return "redirect:/cargo/contract/list.do";
    }

    /*
      url:/contract/toUpdate.do?id=02e1da04-43f8-42e1-a4c2-66e162c6f4a5
      作用： 进入编辑页面,数据回显，通过id查找购销合同信息
      参数： id
     */
    @RequestMapping("/toUpdate")
    public String toAdd(String id){
        Contract contract = contractService.findById(id);
        request.setAttribute("contract",contract);
        return "cargo/contract/contract-update";
    }

    /*
      url:/contract/delete.do?id=02e1da04-43f8-42e1-a4c2-66e162c6f4a5
      作用： 删除选择的购销合同，返回购销合同列表页面
      参数： 购销合同id
     */
    @RequestMapping("/delete")
    public String delete(String id){
        contractService.delete(id);
        return "redirect:/cargo/contract/list.do";
    }


    /*
      url:/cargo/contract/toView.do?id=dd63eb3c-6d4e-4a85-9c37-fcfda1998c1d
      作用： 查看购销合同信息
      参数： id
    */
    @RequestMapping("/toView")
    public String toView(String id){
        Contract contract = contractService.findById(id);
        request.setAttribute("contract",contract);
        return "cargo/contract/contract-view";
    }

    /*
      url:/cargo/contract/submit.do?id=dd63eb3c-6d4e-4a85-9c37-fcfda1998c1d
      作用： 更新购销合同信息中的状态
      参数： id
    */
    @RequestMapping("/submit")
    @ResponseBody
    public String submit(String id){
        //1. 根据购销合同的id查找购销合同
        Contract contract = contractService.findById(id);

        //如果合同的审核人与登录者的名字一致，则可以通过审核
        if (contract.getCheckBy().equals(getLoginUser().getUserName())) {
            //2. 修改购销合同的状态为1,更新购销合同
            contract.setState(1);
            contractService.update(contract);
            return "1";
        }else {
            return "0";

        }
        //3. 返回购销合同列表页面
    }


    /*
      url:/cargo/contract/cancel.do?id=dd63eb3c-6d4e-4a85-9c37-fcfda1998c1d
      作用： 取消购销合同信息中的状态
      参数： id
    */
    @RequestMapping("/cancel")
    public String cancel(String id){
        Contract contract = contractService.findById(id);
        contract.setState(0);
        contractService.update(contract);
        return "redirect:/cargo/contract/list.do";
    }
}
